Appearance
《C语言程序设计》期末试卷 (精选09)
一、判断题(每题 1 分,共 10 分)
要求: 正确打钩 ($\checkmark$),错误打叉 ($\times$)
C 程序的执行从 main 函数开始,所以 main 函数必须放在程序最前面。
查看答案与解析
答案:$\times$
解析: C 程序的执行确实是从
main函数开始的,但main函数在源代码文件中的物理位置是随机的。它可以放在程序的开头、中间或末尾,不影响程序的入口定位。难度: ⭐ 考点:
#main函数#程序入口💡 学习锦囊
📖 相关公式与知识点:
- 一个 C 程序有且仅有一个
main函数。 - 编译系统通过名称定位入口点,而非行号或次序。
思路分析
区分"逻辑起点"与"物理位置"。执行从
main开始是逻辑上的,而代码书写顺序是物理上的。🔄 举一反三
- 一个 C 语言程序可以有多个 main 函数吗?
查看练习答案与解析
答案:不可以。 解析:
main函数是程序的唯一入口。如果定义多个,编译器会报"重定义"错误,因为系统无法确定从哪个函数开始执行。
- 一个 C 程序有且仅有一个
任何变量都必须先定义其类型。
查看答案与解析
答案:$\checkmark$
解析: C 语言是强类型语言(或静态类型语言)。在内存中为变量分配空间之前,编译器必须明确该变量的类型(如
int,float,char等),以便确定分配的字节数和数据的编码方式。难度: ⭐ 考点:
#变量定义#强类型💡 学习锦囊
📖 相关公式与知识点:
- 变量定义的基本格式:
类型 变量名; - 定义的作用:分配存储空间,指定运算规则。
🔄 举一反三
- 变量可以在赋值的同时定义吗?例如
x = 5;而不写int x;。查看练习答案与解析
答案:不可以(在 C 语言中)。 解析:必须先声明类型,如
int x = 5;。直接赋值未定义的变量会导致"未声明的标识符"错误。
- 变量定义的基本格式:
用格式符
%d输出一个 float 类型变量时,会截断小数点部分,输出其整数部分。查看答案与解析
答案:$\times$
解析:
%d是整型格式符,它会按照整数的内存表示去解析数据。float类型在内存中采用 IEEE 754 标准存储(包含符号位、阶码、尾数),与整数的补码存储完全不同。使用错误的格式符会导致解析出的数值完全错误,甚至输出 0,而不仅仅是截断小数。难度: ⭐⭐ 考点:
#格式符#数据类型#内存表示💡 学习锦囊
📖 相关公式与知识点:
- 正确的格式符:
float→%f,double→%lf,int→%d。 - 类型不匹配的后果:未定义行为(UB),可能输出乱码或程序崩溃。
🔄 举一反三
- 用
%f输出int变量会怎样?查看练习答案与解析
答案:同样会出错。 解析:
%f期望的是浮点数在内存中的表示(如 IEEE 754),而int是补码表示,两者不兼容。
- 正确的格式符:
在 C 语言中,
a = b = 1;是合法的赋值语句。查看答案与解析
答案:$\checkmark$
解析: 赋值运算符
=是右结合的,且表达式本身有值(即赋值后左侧变量的值)。因此a = b = 1;等价于a = (b = 1);,先执行b = 1(返回 1),再执行a = 1。难度: ⭐ 考点:
#赋值运算符#结合性💡 学习锦囊
📖 相关公式与知识点:
- 赋值表达式:
变量 = 表达式的值等于赋值后变量的值。 - 结合性:
=是右结合,+、-、*、/是左结合。
🔄 举一反三
a = b = c = 0;的执行顺序是什么?查看练习答案与解析
答案:从右向左。 解析:
a = (b = (c = 0)),先c = 0,再b = 0,最后a = 0。
- 赋值表达式:
在 C 语言中,
int a[10];定义了一个包含 10 个整数的数组,其下标范围是 1 到 10。查看答案与解析
答案:$\times$
解析: C 语言的数组下标从 0 开始。
int a[10];定义了 10 个元素:a[0],a[1], ...,a[9]。访问a[10]是越界行为(未定义行为)。难度: ⭐ 考点:
#数组下标#越界访问💡 学习锦囊
📖 相关公式与知识点:
- 数组长度:
sizeof(a) / sizeof(a[0])。 - 常见错误:循环中
for(i=1; i<=10; i++)访问a[i]会导致越界。
🔄 举一反三
- 如何正确定义并遍历一个长度为 5 的数组?
查看练习答案与解析
答案:
cint arr[5]; for(int i=0; i<5; i++) { // 使用 arr[i] }1
2
3
4
- 数组长度:
break语句只能用于 switch 语句中。查看答案与解析
答案:$\times$
解析:
break语句可以用于:- switch 语句:跳出当前 case
- 循环(for/while/do-while):立即终止循环 但不能用于跳出 if 语句或函数。
难度: ⭐ 考点:
#break语句#流程控制💡 学习锦囊
📖 相关公式与知识点:
breakvscontinue:break终止整个循环,continue跳过本次循环剩余部分。goto:可以跳转到任意标签,但一般不推荐使用。
🔄 举一反三
- 在嵌套循环中,内层循环的
break会影响外层循环吗?查看练习答案与解析
答案:不会。 解析:
break只跳出最近的一层循环。要跳出多层循环需要使用标志变量或goto。
函数可以嵌套定义,即在一个函数内部定义另一个函数。
查看答案与解析
答案:$\times$
解析: C 语言不支持函数嵌套定义。所有函数必须在全局作用域中定义(即不能在一个函数内部定义另一个函数)。但可以嵌套调用。
难度: ⭐ 考点:
#函数定义#作用域💡 学习锦囊
📖 相关公式与知识点:
- 函数声明:
返回值类型 函数名(参数列表); - 函数定义:包含函数体
{ ... } - C++ 支持 lambda 表达式(匿名函数),但 C 不支持。
🔄 举一反三
- 如何在函数内部使用另一个函数?
查看练习答案与解析
答案:先声明(或定义)该函数,然后在函数内部调用。 示例:
cvoid helper() { /* ... */ } void main() { helper(); } // 正确:调用已定义的函数1
2
- 函数声明:
宏定义
#define PI 3.14159会在编译时进行类型检查。查看答案与解析
答案:$\times$
解析: 宏是预处理指令,在编译前进行简单的文本替换,没有类型检查。
PI会被直接替换为3.14159,不管上下文是否类型匹配。难度: ⭐⭐ 考点:
#宏定义#预处理#类型安全💡 学习锦囊
📖 相关公式与知识点:
- 宏 vs const:
const double PI = 3.14159;有类型检查,更安全。 - 带参数宏:
#define MAX(a,b) ((a)>(b)?(a):(b))
🔄 举一反三
- 为什么带参数的宏需要给每个参数加括号?
查看练习答案与解析
答案:避免运算符优先级问题。 示例:
MAX(a+b, c*d)如果不加括号会变成a+b > c*d ? a+b : c*d,可能不符合预期。
- 宏 vs const:
在 C 语言中,字符串是以字符 '\0' 结尾的字符数组。
查看答案与解析
答案:$\checkmark$
解析: 这是 C 语言字符串的核心特征。
'\0'(ASCII 值为 0)作为字符串的结束标志,使得字符串处理函数(如strlen,strcpy)知道在哪里停止。难度: ⭐ 考点:
#字符串#结束符💡 学习锦囊
📖 相关公式与知识点:
- 字符串字面量:
"hello"自动包含'\0'。 - 字符数组初始化:
char s[6] = "hello";或char s[] = "hello";
🔄 举一反三
char s[5] = "hello";是否正确?查看练习答案与解析
答案:错误。 解析:
"hello"有 5 个字符,但需要 6 个字节的空间(包含'\0')。应该定义为char s[6] = "hello";。
- 字符串字面量:
文件操作完成后必须调用
fclose函数关闭文件。查看答案与解析
答案:$\checkmark$
解析: 关闭文件的重要性:
- 释放资源:文件描述符是有限的系统资源
- 确保写入:缓冲区中的数据可能还未真正写入磁盘
- 避免数据损坏:异常退出时未关闭的文件可能丢失数据
难度: ⭐ 考点:
#文件操作#资源管理💡 学习锦囊
📖 相关公式与知识点:
- 文件操作三部曲:
fopen→ 读写操作 →fclose - 错误处理:检查
fopen返回值是否为NULL
🔄 举一反三
- 如果不调用
fclose会怎样?查看练习答案与解析
答案:程序正常退出时系统会自动关闭,但:
- 可能丢失缓冲区中的数据
- 长期运行的程序会耗尽文件描述符
- 不是好的编程习惯
二、单项选择题(每题 2 分,共 20 分)
以下合法的 C 语言标识符是 ( )。
- A.
3abc - B.
_name - C.
int - D.
a-b
查看答案与解析
答案:B
解析:
- A:不能以数字开头
- B:正确,以下划线开头是合法的
- C:
int是关键字,不能作为标识符 - D:不能包含减号(
-)
难度: ⭐ 考点:
#标识符规则💡 学习锦囊
📖 相关公式与知识点:
- 标识符规则:字母/下划线开头,后跟字母/数字/下划线
- 关键字:
int,float,if,for等保留字不能用作标识符
🔄 举一反三
- 以下哪个是合法的标识符?
- A.
2var - B.
var-name - C.
var_name - D.
float
查看练习答案与解析
答案:C
- A.
- A.
表达式
(int)3.6 * 3的值是 ( )。- A. 10.8
- B. 9
- C. 10
- D. 编译错误
查看答案与解析
答案:B
解析:
(int)3.6进行强制类型转换,结果为 3(截断小数部分)3 * 3 = 9注意:类型转换优先级高于乘法。
难度: ⭐⭐ 考点:
#类型转换#运算符优先级💡 学习锦囊
📖 相关公式与知识点:
- 强制类型转换:
(类型)表达式 - 浮点转整型:直接截断小数部分(不是四舍五入)
🔄 举一反三
(int)(3.6 * 3)的结果是多少?查看练习答案与解析
答案:10解析:先计算
3.6 * 3 = 10.8,再转换为int得到 10。
设有定义
int a=3, b=4, c=5;,则表达式!(a+b)+c-1 && b+c/2的值是 ( )。- A. 6
- B. 0
- C. 2
- D. 1
查看答案与解析
答案:D
解析: 按运算符优先级计算:
a+b=7→!(7)=0(逻辑非:非0变0,0变1)0+c-1=0+5-1=4b+c/2=4+5/2=4+2=6(整数除法)4 && 6→ 真(非0),结果为 1
难度: ⭐⭐⭐ 考点:
#逻辑运算#运算符优先级💡 学习锦囊
📖 相关公式与知识点:
- 优先级:
()>!>*/%>+->&&>|| - 逻辑运算结果:真为 1,假为 0
🔄 举一反三
!0 && 2 || 0的结果是多少?查看练习答案与解析
答案:1解析:
!0=1,1&&2=1,1||0=1。
以下程序的输出结果是 ( )。
c#include <stdio.h> void main() { int i, sum=0; for(i=1; i<=3; sum+=i, i++); printf("%d", sum); }1
2
3
4
5
6
7- A. 6
- B. 3
- C. 死循环
- D. 0
查看答案与解析
答案:A
解析:
- 注意 for 循环语句以分号结束,循环体为空
- 执行过程:
- i=1: sum=0+1=1, i=2
- i=2: sum=1+2=3, i=3
- i=3: sum=3+3=6, i=4
- i=4>3,循环结束
- 输出:6
难度: ⭐⭐ 考点:
#for循环#逗号运算符💡 学习锦囊
📖 相关公式与知识点:
- 逗号运算符:按顺序执行,整个表达式的值为最后一个表达式的值
- 空语句:单独的分号
;是一个空语句
🔄 举一反三
- 以下代码输出什么?c
int x = (1, 2, 3); printf("%d", x);1
2查看练习答案与解析
答案:3
以下关于数组初始化的语句中,正确的是 ( )。
- A.
int a[3] = {1, 2, 3, 4}; - B.
int a[] = {1, 2, 3}; - C.
int a[3] = {}; - D.
int a[];
查看答案与解析
答案:B
解析:
- A:初始值个数超过数组长度
- B:正确,编译器自动推断长度为 3
- C:C99 之前不支持空初始化列表
- D:必须指定长度或提供初始值
难度: ⭐ 考点:
#数组初始化💡 学习锦囊
📖 相关公式与知识点:
- 部分初始化:
int a[5] = {1,2};后三个元素为 0 - 指定初始化:
int a[5] = {[2]=3, [4]=5};(C99)
🔄 举一反三
int a[] = {1};的数组长度是多少?查看练习答案与解析
答案:1
- A.
以下程序的输出结果是 ( )。
c#include <stdio.h> void main() { int a=2, b=-1, c=2; if(a < b) if(b < 0) c=0; else c++; printf("%d", c); }1
2
3
4
5
6
7
8
9- A. 0
- B. 1
- C. 2
- D. 3
查看答案与解析
答案:C
解析:
- 注意 else 与最近的未匹配的 if 配对(就近匹配原则)
- 实际结构:c
if(a < b) { // 2<-1 为假,跳过整个块 if(b < 0) c=0; else c++; // else 与 if(b<0) 配对 }1
2
3
4 - 由于
a < b(2 < -1)为假,整个 if 块被跳过,c 保持原值 2 - 缩进虽然暗示 else 与外层 if 配对,但 C 语言编译器只遵循就近匹配原则
- 输出:2
难度: ⭐⭐ 考点:
#if-else匹配#缩进误导💡 学习锦囊
📖 相关公式与知识点:
- else 匹配原则:与最近的未匹配的 if 匹配
- 使用大括号避免歧义
易错点
缩进不能改变 else 的匹配规则!else 始终与最近的未匹配 if 配对,无论缩进如何。为避免歧义,建议始终使用大括号。
🔄 举一反三
- 以下代码输出什么?c
int x=1, y=2; if(x>y) if(y>0) x=3; else x=4; printf("%d", x);1
2
3查看练习答案与解析
答案:1解析:else 与最近的
if(y>0)配对。外层if(x>y)为假(1>2),跳过整个 if-else 结构,x 保持 1。
以下关于函数的说法中,正确的是 ( )。
- A. 实参和形参占用相同的内存单元
- B. 形参可以是常量
- C. 函数的返回值类型不能是 void
- D. 函数可以没有参数
查看答案与解析
答案:D
解析:
- A:错误,实参和形参是不同的变量,占用不同内存
- B:错误,形参必须是变量
- C:错误,
void表示函数不返回值 - D:正确,如
void func(void)
难度: ⭐ 考点:
#函数参数#返回值💡 学习锦囊
📖 相关公式与知识点:
- 参数传递:值传递(拷贝)、地址传递(指针)
- 无参函数:
void func(void)或void func()
🔄 举一反三
- 以下函数声明哪个是正确的?
- A.
int func(int a, b); - B.
void func(int); - C.
func(void) int; - D.
int func(3);
查看练习答案与解析
答案:B
- A.
设有定义
char s[]="abc";,则sizeof(s)和strlen(s)的值分别是 ( )。- A. 3, 3
- B. 4, 3
- C. 3, 4
- D. 4, 4
查看答案与解析
答案:B
解析:
sizeof(s):数组总字节数,"abc"包含'a','b','c','\0'共 4 个字符strlen(s):字符串长度(不包含'\0'),结果为 3
难度: ⭐⭐ 考点:
#sizeof#strlen#字符串存储💡 学习锦囊
📖 相关公式与知识点:
sizeof:编译时确定,返回类型或对象的大小strlen:运行时计算,遍历直到'\0'
🔄 举一反三
char s[10]="hello";的sizeof(s)和strlen(s)分别是多少?查看练习答案与解析
答案:10, 5
以下程序的输出结果是 ( )。
c#include <stdio.h> void main() { int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; int i, sum=0; for(i=0; i<3; i++) sum += a[i][2-i]; printf("%d", sum); }1
2
3
4
5
6
7
8
9- A. 15
- B. 10
- C. 9
- D. 不确定
查看答案与解析
答案:A
解析: 访问的元素:
- i=0: a[0][2] = 3
- i=1: a[1][1] = 5
- i=2: a[2][0] = 7
- sum = 3+5+7 = 15
难度: ⭐⭐ 考点:
#二维数组#对角线访问💡 学习锦囊
📖 相关公式与知识点:
- 二维数组内存布局:按行存储
- 主对角线:a[i][i],副对角线:a[i][n-1-i]
🔄 举一反三
- 如何求 3×3 矩阵主对角线元素之和?
查看练习答案与解析
答案:
cfor(i=0; i<3; i++) sum += a[i][i];1
2
以"只写"方式打开文本文件
d:\tmp.txt,下列语句中正确的是 ( )。- A.
fp=fopen("d:\tmp.txt", "r"); - B.
fp=fopen("d:\tmp.txt", "w"); - C.
fp=fopen("d:\tmp.txt", "wb"); - D.
fp=fopen("d:\tmp.txt", "a");
查看答案与解析
答案:B
解析:
"r":只读"w":只写(文本模式)✓"wb":只写(二进制模式)- 题目要求"只写"和"文本文件",故选
"w"
难度: ⭐ 考点:
#文件打开模式#fopen💡 学习锦囊
📖 相关公式与知识点:
- 文本 vs 二进制:文本模式带
b字后缀
🔄 举一反三
- 模式
"a+"的含义是什么?查看练习答案与解析
答案:以读/写方式打开文件进行追加
- A.
三、程序阅读题(每题 5 分,共 25 分)
1. while 与 do-while 循环对比
#include <stdio.h>
void main()
{
int i=10, s=0;
while(i>10) {
s+=i;
i--;
}
printf("while: s=%d\n",s);
i=10; s=0;
do {
s+=i;
i--;
} while(i>10);
printf("do-while: s=%d\n",s);
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
查看答案与解析
输出结果:
while: s=0
do-while: s=102
解析:
- while 循环:先判断条件
i>10(10>10 为假),循环体一次都不执行 - do-while 循环:先执行一次循环体(s=0+10=10, i=9),再判断条件
i>10(9>10 为假)
关键差异:
- while:先判断后执行(可能执行 0 次)
- do-while:先执行后判断(至少执行 1 次)
难度: ⭐ 考点: #while循环 #do-while循环 #循环条件
💡 学习锦囊
📖 相关公式与知识点:
- 循环选择:
- 已知循环次数 → for
- 条件控制,可能不执行 → while
- 条件控制,至少执行一次 → do-while
🔄 举一反三
- 将条件改为
i>=10,输出结果会怎样变化?查看练习答案与解析
答案:两个循环都会变成无限循环 解析:初始 i=10,条件 i>=10 永远为真。
2. 静态变量与自动变量
#include <stdio.h>
int func(int x)
{
static int y = 0;
int s = x + y;
y++;
return s;
}
void main()
{
printf("%d,", func(0));
printf("%d,", func(1));
printf("%d", func(2));
}2
3
4
5
6
7
8
9
10
11
12
13
14
查看答案与解析
输出结果:
0,2,4解析:
static int y = 0;:静态变量,只初始化一次,函数调用间保持值- 执行过程:
func(0):y=0, s=0+0=0, y=1 → 返回 0func(1):y=1, s=1+1=2, y=2 → 返回 2func(2):y=2, s=2+2=4, y=3 → 返回 4
难度: ⭐⭐ 考点: #static变量 #变量生命周期
💡 学习锦囊
📖 相关公式与知识点:
- 自动变量:每次调用重新初始化
- 静态变量:只初始化一次,程序运行期间保持
- 常见错误:
- 忘记 static 变量在函数退出后值不丢失
- 忽略
y++是先用后增,返回值时 y 还没增,但下次调用时 y 已增
🔄 举一反三
- 再次调用
func(0),在 static 模式下结果是多少?查看练习答案与解析
答案:3 解析:上次调用后 y 变成了 3。再次调用
func(0)时,y 保持 3,$s = 0 + 3 = 3$,然后 y 自增为 4。
四、程序填空题(每空 2 分,共 20 分)
1. 求阶乘和
程序功能: 从键盘输入 n,求表达式 $1!+2!+3!+\dots+n!$ 的和。
#include <stdio.h>
void main()
{
int i,n;
double s=1,k=1;
scanf("%d",&n);
for(i=2;i<=n;i++){
_____(1)_____;
_____(2)_____;
}
printf("%.0f",s);
}2
3
4
5
6
7
8
9
10
11
12
查看答案与解析
答案: (1) k *= i; (或 k = k * i;) (2) s += k; (或 s = s + k;)
解析: 这是一个累加求和算法,其中每一项又是阶乘(累乘)。
- (1) 处:变量
k用于存储当前的阶乘值。当 $i=2$ 时,我们需要计算 $2!$,即 $1! \times 2$。所以k = k * i。 - (2) 处:变量
s用于存储总和。计算出当前项k后,需要累加进s。所以s = s + k。
难度: ⭐⭐ 考点: #累加累乘 #阶乘算法
💡 学习锦囊
📖 相关公式与知识点:
- 递推关系:$n! = (n-1)! \times n$
- 循环初始化:注意 $s$ 和 $k$ 的初始值(本题均已初始化为 1,对应 $1!$)
🔄 举一反三
- 如果要计算 $\sum_{i=1}^n \frac{1}{i!}$,(2) 处应该改为什么?
查看练习答案与解析
答案:
s += 1.0/k;
2. 求最大素数之和
程序功能: 计算并输出 num 以内最大的 10 个素数之和,num 由主函数传给 fun 函数。如 num 为 100,则结果为 732;如 num 为 10,则结果为 $7+5+3+2=17$。
#include <stdio.h>
int fun( int num)
{
int sum=0, n=0, j, flag;
while ((num>= 2) && ( __ (3) __ ))
{
flag = 1;
for (j=2; j<=num/2; j++)
{
if ( __ (4) __ )
{
flag =0;
break;
}
}
if(flag)
{
sum +=num;
n++;
}
num--;
}
__ (5) __;
}
void main ( )
{
int num;
scanf("%d",&num);
printf("%d\n", fun(num));
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
查看答案与解析
答案: (3) n < 10 (4) num % j == 0 (5) return sum;
解析:
- (3) 处:题目要求找最大的 10 个素数。变量
n记录已找到的素数个数。当 $n < 10$ 时继续寻找。 - (4) 处:素数判定逻辑。如果
num能被j整除,则不是素数。条件为num % j == 0。 - (5) 处:函数需要返回计算出的总和
sum。
难度: ⭐⭐⭐ 考点: #素数判定 #循环控制 #函数返回值
💡 学习锦囊
📖 相关公式与知识点:
- 素数定义:只能被 1 和自身整除的自然数
- 判定优化:通常判断到 $\sqrt{num}$ 即可,本题使用了 $num/2$ 也是正确的
🔄 举一反三
- 若要判断一个数是否为偶数,(4) 处的表达式如何修改?
查看练习答案与解析
答案:
num % 2 == 0
3. 杨辉三角形
程序功能: 输出以下形式的杨辉三角形。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 12
3
4
5
6
7
#include <stdio.h>
#define N 7
void yanghui(__ (6) __ )
{
int i,j;
for (i=0;i<N;i++) {
a[i][0]=1;
a[i][i]=1;
}
for (i=2;i<N;i++)
for (j=1; __ (7) __ ;j++)
a[i][j]= a[i-1][j-1]+ __ (8) __ ;
}
void main()
{
int x[N][N],i,j;
yanghui(x);
for (i=0;i<N;i++){
for (j=0;j<=i;j++)
printf("%3d",x[i][j]);
printf("\n");
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
查看答案与解析
答案: (6) int a[][N] (或 int a[N][N]) (7) j < i (8) a[i-1][j]
解析:
- (6) 处:形参接收二维数组。C 语言规定,二维数组作形参时,第二维长度必须固定。
- (7) 处:杨辉三角每行的中间部分计算。对于第
i行,其索引范围是 $0 \sim i$。两端(0 和 i)已赋值为 1,中间部分 $1 \sim i-1$ 需要计算。故j < i。 - (8) 处:核心公式。每个数等于它上方两数之和:$a[i][j] = a[i-1][j-1] + a[i-1][j]$。
难度: ⭐⭐⭐ 考点: #二维数组传参 #递推算法 #杨辉三角
💡 学习锦囊
📖 相关公式与知识点:
- 杨辉三角性质:第 $n$ 行第 $m$ 个数是组合数 $C_{n-1}^{m-1}$
🔄 举一反三
- 若要输出杨辉三角的第 10 行,
N应定义为多少?查看练习答案与解析
答案:10
4. 寻找最大字符串
程序功能: 输入 5 个字符串,输出其中字典序最大的字符串。
#include<stdio.h>
#include<string.h>
void main()
{
char s[80],max[80];
int i;
scanf("%s",max);
for(i=1;i<=4;i++){
scanf("%s",s);
if(__(9)__)
__(10)__;
}
printf("最大字符串是: %s\n",max);
}2
3
4
5
6
7
8
9
10
11
12
13
14
查看答案与解析
答案: (9) strcmp(s, max) > 0 (10) strcpy(max, s);
解析:
- (9) 处:字符串比较不能直接使用
>,必须使用库函数strcmp。返回正值表示前者大于后者。 - (10) 处:找到更大的字符串后,需要将其内容更新到
max中。字符数组赋值必须使用strcpy。
难度: ⭐⭐ 考点: #字符串函数 #strcmp #strcpy
💡 学习锦囊
📖 相关公式与知识点:
strcmp(s1, s2):s1=s2 返回 0,s1>s2 返回正值,s1<s2 返回负值strcpy(dest, src):将 src 拷贝到 dest
🔄 举一反三
- 若要输出最短的字符串,(9) 处应如何修改?(假设已包含
strlen)查看练习答案与解析
答案:
strlen(s) < strlen(max)
五、程序设计题(每题 10 分,共 30 分)
1. 数字逆序输出
题目: 编写程序,输入一个正整数,将其各位数字逆序输出。例如输入 12345,输出 54321。
查看答案与解析
【参考代码】
#include <stdio.h>
void main()
{
int num, digit;
printf("请输入一个正整数: ");
scanf("%d", &num);
printf("逆序输出: ");
while(num > 0) {
digit = num % 10; // 取最后一位
printf("%d", digit); // 输出该位
num = num / 10; // 去掉最后一位
}
printf("\n");
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
难度: ⭐⭐ 考点: #取模运算 #整数分解 #循环控制
💡 学习锦囊
📖 相关公式与知识点:
- 取个位:
num % 10 - 去掉个位:
num / 10 - 循环条件:
num > 0(处理完所有位)
🔄 举一反三
- 如何将逆序后的数字存储为一个新的整数(如 12345 → 54321)?
查看练习答案与解析
解析:
cint reverse = 0; while(num > 0) { reverse = reverse * 10 + num % 10; num /= 10; }1
2
3
4
5
2. 密码强度验证
题目: 编写函数 checkPassword,验证密码是否包含至少一个字母和一个数字。返回 1 表示符合要求,0 表示不符合。
查看答案与解析
【参考代码】
#include <stdio.h>
#include <ctype.h>
int checkPassword(char s[])
{
int hasLetter = 0, hasDigit = 0;
int i;
for(i=0; s[i]!='\0'; i++) {
if(isalpha(s[i])) hasLetter = 1;
if(isdigit(s[i])) hasDigit = 1;
}
return hasLetter && hasDigit;
}
void main()
{
char password[100];
printf("请输入密码: ");
scanf("%s", password);
if(checkPassword(password)) {
printf("密码强度符合要求\n");
} else {
printf("密码必须包含字母和数字\n");
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
难度: ⭐⭐ 考点: #字符串遍历 #标志变量 #ctype宏
💡 学习锦囊
📖 相关公式与知识点:
- 标志位(Flag):利用
hasLetter和hasDigit记录是否出现过目标字符 ctype.h:推荐使用isalpha()和isdigit()使代码更简洁
🔄 举一反三
- 增加要求:密码长度必须大于 6 位。应在函数中如何补充?
查看练习答案与解析
解析: 利用
strlen(s) > 6进行判断。 修改后:creturn hasLetter && hasDigit && (strlen(s) > 6);1
3. 时间结构体运算
题目: 利用结构体编写程序,输入某一时刻的时间(时:分:秒),计算加一秒后的时间,并以 hh:mm:ss 格式输出。
查看答案与解析
【参考代码】
#include <stdio.h>
struct Time
{
int hour;
int minute;
int second;
};
void addOneSecond(struct Time *t)
{
t->second++; // 秒加1
if(t->second >= 60) { // 秒满60进分
t->second = 0;
t->minute++;
if(t->minute >= 60) { // 分满60进时
t->minute = 0;
t->hour++;
if(t->hour >= 24) { // 时满24归零
t->hour = 0;
}
}
}
}
void main()
{
struct Time now;
printf("请输入当前时间(时 分 秒): ");
scanf("%d %d %d", &now.hour, &now.minute, &now.second);
addOneSecond(&now);
printf("加一秒后的时间: %02d:%02d:%02d\n", now.hour, now.minute, now.second);
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
难度: ⭐⭐ 考点: #结构体 #进位逻辑 #结构体指针
💡 学习锦囊
📖 相关公式与知识点:
- 进位思想:秒满 60 进分,分满 60 进时,时满 24 清零
- 输出格式:
%02d表示输出宽度为 2,不足 2 位前方补 0
思路分析
这类题目的核心是正确处理三级嵌套的 if 进位。不要忘记小时满 24 后应回退到 0。
🔄 举一反三
- 如果要"减一秒",核心逻辑应如何改动?
查看练习答案与解析
解析:
ct->second--; if(t->second < 0) { t->second = 59; t->minute--; // ... 依此类推处理分和时 }1
2
3
4
5
6